{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorFlow2教程-CNN-RNN结构用于图像处理"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.导入数据\n",
    "使用cifar-10数据集\n",
    "![](https://image.slidesharecdn.com/pycon2015-150913033231-lva1-app6892/95/pycon-2015-48-638.jpg?cb=1442115225)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.metrics import accuracy_score\n",
    "from tensorflow import keras\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train = keras.utils.to_categorical(y_train)\n",
    "y_test = keras.utils.to_categorical(y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(50000, 32, 32, 3)   (50000, 10)\n",
      "(10000, 32, 32, 3)   (10000, 10)\n"
     ]
    }
   ],
   "source": [
    "print(x_train.shape, ' ', y_train.shape)\n",
    "print(x_test.shape, ' ', y_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.简单的cnn-rnn结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from tensorflow.keras import layers\n",
    "model = keras.Sequential()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_shape = x_train.shape\n",
    "model.add(layers.Conv2D(input_shape=(x_shape[1], x_shape[2], x_shape[3]),\n",
    "                       filters=32, kernel_size=(3,3), strides=(1,1), \n",
    "                       padding='same', activation='relu'))\n",
    "model.add(layers.MaxPool2D(pool_size=(2,2)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(None, 16, 16, 32)\n"
     ]
    }
   ],
   "source": [
    "print(model.output_shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.add(layers.Reshape(target_shape=(16*16, 32)))\n",
    "model.add(layers.LSTM(50, return_sequences=False))\n",
    "\n",
    "model.add(layers.Dense(10, activation='softmax'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d (Conv2D)              (None, 32, 32, 32)        896       \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 16, 16, 32)        0         \n",
      "_________________________________________________________________\n",
      "reshape (Reshape)            (None, 256, 32)           0         \n",
      "_________________________________________________________________\n",
      "unified_lstm (UnifiedLSTM)   (None, 50)                16600     \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 10)                510       \n",
      "=================================================================\n",
      "Total params: 18,006\n",
      "Trainable params: 18,006\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.CategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 45000 samples, validate on 5000 samples\n",
      "Epoch 1/5\n",
      "45000/45000 [==============================] - 139s 3ms/sample - loss: 2.1328 - accuracy: 0.2132 - val_loss: 2.0399 - val_accuracy: 0.2386\n",
      "Epoch 2/5\n",
      "45000/45000 [==============================] - 145s 3ms/sample - loss: 1.9657 - accuracy: 0.2684 - val_loss: 1.8785 - val_accuracy: 0.3004\n",
      "Epoch 3/5\n",
      "45000/45000 [==============================] - 146s 3ms/sample - loss: 1.8475 - accuracy: 0.3048 - val_loss: 1.7853 - val_accuracy: 0.3290\n",
      "Epoch 4/5\n",
      "45000/45000 [==============================] - 135s 3ms/sample - loss: 1.7433 - accuracy: 0.3447 - val_loss: 1.7078 - val_accuracy: 0.3520\n",
      "Epoch 5/5\n",
      "45000/45000 [==============================] - 137s 3ms/sample - loss: 1.6751 - accuracy: 0.3693 - val_loss: 1.6920 - val_accuracy: 0.3664\n",
      "CPU times: user 28min 48s, sys: 1min 28s, total: 30min 16s\n",
      "Wall time: 11min 41s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "history = model.fit(x_train, y_train, batch_size=32,epochs=5, validation_split=0.1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "plt.plot(history.history['accuracy'])\n",
    "plt.plot(history.history['val_accuracy'])\n",
    "plt.legend(['training', 'valivation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000/10000 [==============================] - 6s 603us/sample - loss: 1.7132 - accuracy: 0.3590\n"
     ]
    }
   ],
   "source": [
    "res = model.evaluate(x_test,y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## CNN和LSTM结果合并"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_shape = x_train.shape\n",
    "inn = layers.Input(shape=(x_shape[1], x_shape[2], x_shape[3]))\n",
    "conv = layers.Conv2D(filters=32,kernel_size=(3,3), strides=(1,1),\n",
    "                    padding='same', activation='relu')(inn)\n",
    "pool = layers.MaxPool2D(pool_size=(2,2), padding='same')(conv)\n",
    "flat = layers.Flatten()(pool)\n",
    "dense1 = layers.Dense(64)(flat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "reshape = layers.Reshape(target_shape=(x_shape[1]*x_shape[2], x_shape[3]))(inn)\n",
    "lstm_layer = layers.LSTM(32, return_sequences=False)(reshape)\n",
    "dense2 = layers.Dense(64)(lstm_layer)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model_1\"\n",
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_1 (InputLayer)            [(None, 32, 32, 3)]  0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv2d_1 (Conv2D)               (None, 32, 32, 32)   896         input_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2D)  (None, 16, 16, 32)   0           conv2d_1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "reshape_1 (Reshape)             (None, 1024, 3)      0           input_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "flatten (Flatten)               (None, 8192)         0           max_pooling2d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "unified_lstm_1 (UnifiedLSTM)    (None, 32)           4608        reshape_1[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "dense_1 (Dense)                 (None, 64)           524352      flatten[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense_2 (Dense)                 (None, 64)           2112        unified_lstm_1[0][0]             \n",
      "__________________________________________________________________________________________________\n",
      "concatenate_1 (Concatenate)     (None, 128)          0           dense_1[0][0]                    \n",
      "                                                                 dense_2[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "dense_4 (Dense)                 (None, 10)           1290        concatenate_1[0][0]              \n",
      "==================================================================================================\n",
      "Total params: 533,258\n",
      "Trainable params: 533,258\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "merged_layer = layers.concatenate([dense1, dense2])\n",
    "outt = layers.Dense(10,activation='softmax')(merged_layer)\n",
    "model = keras.Model(inputs=inn, outputs=outt)\n",
    "model.compile(optimizer=keras.optimizers.Adam(),\n",
    "             loss=keras.losses.CategoricalCrossentropy(),\n",
    "             metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 45000 samples, validate on 5000 samples\n",
      "Epoch 1/5\n",
      "45000/45000 [==============================] - 679s 15ms/sample - loss: 11.2904 - accuracy: 0.3047 - val_loss: 1.8392 - val_accuracy: 0.3776\n",
      "Epoch 2/5\n",
      "45000/45000 [==============================] - 642s 14ms/sample - loss: 1.7014 - accuracy: 0.4163 - val_loss: 1.7302 - val_accuracy: 0.4252\n",
      "Epoch 3/5\n",
      "45000/45000 [==============================] - 574s 13ms/sample - loss: 1.5295 - accuracy: 0.4751 - val_loss: 1.6444 - val_accuracy: 0.4626\n",
      "Epoch 4/5\n",
      "45000/45000 [==============================] - 623s 14ms/sample - loss: 1.4177 - accuracy: 0.5120 - val_loss: 1.6575 - val_accuracy: 0.4666\n",
      "Epoch 5/5\n",
      "45000/45000 [==============================] - 611s 14ms/sample - loss: 1.3566 - accuracy: 0.5345 - val_loss: 1.6687 - val_accuracy: 0.4760\n",
      "CPU times: user 1h 42min 35s, sys: 4min 12s, total: 1h 46min 47s\n",
      "Wall time: 52min 10s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "history2 = model.fit(x_train, y_train, batch_size=64,epochs=5, validation_split=0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(history2.history['accuracy'])\n",
    "plt.plot(history2.history['val_accuracy'])\n",
    "plt.legend(['training', 'valivation'], loc='upper left')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
